/***************************************************************
 * 系统名称           : 智慧零售(SmartRetail)
 * 处理内容           : 根据商品数量及规格解析数据
 * @author            : geping@2018-11-02
 * @Modify            : 
 * @version           : v1.0
 * @Copyright         : 浙江康铭泰克信息科技股份有限公司
 * @Description       : 
 ***************************************************************/
using Comteck.Utils;
using System;

namespace Comteck.Winforms {
  public static class AnalyticalExpressions {
    /// <summary>
    /// 解析业务数据（非标品计算件数及规格，标品计算件数及散货量）
    /// </summary>
    /// <param name="manageTypeId">商品属性：1=标品/2=非标品/3=大码商品/4=周转箱/5=耗材</param>
    /// <param name="qty">数量</param>
    /// <param name="spec">规格</param>
    /// <returns></returns>
    public static (decimal packageQty, decimal bulkQty, decimal spec) Calculate(int? manageTypeId, decimal qty, decimal spec) {
      decimal packageQty = decimal.Zero;
      decimal bulkQty = decimal.Zero;

      //if (manageTypeId == (int)EnumGoodsManage.NotNormal) {  // 非标品
      //  // 先根据规格计算件数（绝对值向上取整）
      //  packageQty = qty >= 0 ? Math.Ceiling(MathHelper.Divide(qty, spec)) : Math.Floor(MathHelper.Divide(qty, spec));
      //  if (packageQty == 0) {//如果数量为0，则规格必然等于0
      //    throw new DivideByZeroException("数量不能为0");
      //  }
      //  // 再根据件数反算规格
      //  spec = MathHelper.Divide(qty, packageQty).Limit();
      //} else {  // 非标品以外的商品
      //  // 先根据规格计算件数（绝对值向下取整）
      //  packageQty = qty >= 0 ? Math.Floor(MathHelper.Divide(qty, spec)) : Math.Ceiling(MathHelper.Divide(qty, spec));
      //  // 再根据件数*数量计算散货量
      //  bulkQty = MathHelper.Minus(qty, MathHelper.Multi(packageQty, spec)).Limit();
      //}
      // 先根据规格计算件数（绝对值向下取整）
      packageQty = qty >= 0 ? Math.Floor(MathHelper.Divide(qty, spec)) : Math.Ceiling(MathHelper.Divide(qty, spec));
      // 再根据件数*数量计算散货量
      bulkQty = MathHelper.Minus(qty, MathHelper.Multi(packageQty, spec)).Limit();
      return (packageQty, bulkQty, spec);
    }

    /// <summary>
    /// 解析批次数据（规格不变）
    /// </summary>
    /// <param name="qty">数量</param>
    /// <param name="spec">规格</param>
    /// <returns></returns>
    public static (decimal packageQty, decimal bulkQty) Calculate(decimal qty, decimal spec) {
      // 先根据规格计算件数（绝对值向下取整）
      var packageQty = qty >= 0 ? Math.Floor(MathHelper.Divide(qty, spec)) : Math.Ceiling(MathHelper.Divide(qty, spec));
      // 再根据件数*数量计算散货量
      var bulkQty = MathHelper.Minus(qty, MathHelper.Multi(packageQty, spec)).Limit();
      return (packageQty, bulkQty);
    }
  }
}
